
#ifndef _FORMJOGO_H_
#define _FORMJOGO_H_

#include <FBase.h>
#include <FUi.h>
#include "model/Mao.h"
#include "model/Baralho.h"
#include "model/AnalisadorJogadas.h"
#include "model/Jogador.h"
#include "view/Desenhadora.h"
#include "controller/Controlador.h"
#include "controller/IListenerControlador.h"
#include "controller/SmartTimer.h"

#define numCartasCompartilhadas 5

enum ShowMode{SM_NONE, SM_INICIO_PARTIDA, SM_DEU_CARTAS, SM_BLIND_REQ, SM_BLIND_OK, SM_APOSTA_JOGADOR, SM_APOSTANDO, SM_PAGANDO, SM_FIM_PARTIDA};
enum TimedAction{TA_INICIAR_PARTIDA, TA_DAR_CARTAS, TA_SOLICITAR_BLIND, TA_INICIAR_RODADA, TA_INICIAR_JOGADA_VEZ, TA_TERMINAR_RODADA, TA_TERMINAR_PARTIDA};

class FormJogo :
	public Osp::Ui::Controls::Form,
	public Osp::Ui::IActionEventListener,
	public Osp::Ui::IItemEventListener,
	public IListenerControlador,
	public Osp::Base::Runtime::ITimerEventListener

{
public:
    FormJogo(void);
    virtual ~FormJogo(void);
    bool Initialize();
    result OnInitializing(void);
    result OnTerminating(void);

    virtual void  OnTimerExpired(Osp::Base::Runtime::Timer &timer);
    virtual void OnActionPerformed(const Osp::Ui::Control & source, int actionId);
    virtual void OnItemStateChanged(const Osp::Ui::Control &source, int index, int itemId, Osp::Ui::ItemStatus status);
    virtual result OnDraw();
	virtual void OnInicioPartida();
	virtual void OnDarCartasJogadores();
	virtual void OnSolicitarBlind();
	virtual void OnRecebeuBlinds();
	virtual void OnInicioRodadaDeAposta();
	virtual void OnInicioJogadaJogador();
	virtual void OnJogadorJogou(Acao *acao);
	virtual void OnFimRodadaAposta();
	virtual void OnPagaVencedor(Jogador* j, Combinacao* c);
	virtual void OnFimPartida();
protected:

    int apostaJogador;
    ShowMode showMode;
    Desenhadora* desenhadora;
    Controlador *controlador;
    SmartTimer* timer;

    static const int ID_BUTTON_LEAVE = 101;
    static const int ID_BUTTON_FOLD_BLIND = 102;
    static const int ID_BUTTON_BLIND = 103;
    static const int ID_BUTTON_RAISE = 104;
    static const int ID_BUTTON_CALL = 105;
    static const int ID_BUTTON_FOLD = 106;
    static const int ID_BUTTON_BET = 107;
    static const int ID_BUTTON_CHECK = 108;

    Osp::Ui::Controls::Label *__pLabelPot;
    Osp::Ui::Controls::Label *__pLabelVencedor;
    Osp::Ui::Controls::Label *__pLabelJogador;
    Osp::Ui::Controls::Label *__pLabelJogadorAI1;
    Osp::Ui::Controls::Label *__pLabelJogadorAI2;
    Osp::Ui::Controls::Label *__pLabelJogadorAI3;

    Osp::Ui::Controls::Button *__pButtonLeave;
    Osp::Ui::Controls::Button *__pButtonFoldBlind;
    Osp::Ui::Controls::Button *__pButtonBlind;
    Osp::Ui::Controls::Button *__pButtonRaise;
    Osp::Ui::Controls::Button *__pButtonCall;
    Osp::Ui::Controls::Button *__pButtonFold;
    Osp::Ui::Controls::Button *__pButtonBet;
    Osp::Ui::Controls::Button *__pButtonCheck;

    Osp::Ui::Controls::List *__pListApostas;

    int valorAposta;


private:
    void RequestFormMenu();
    void AtualizaInfoJogadoresAI();
    void InitializeLabels();
    void InitializeButtons();
    void ButtonLeavePressed();
    void ButtonFoldBlindPressed();
    void ButtonBlindPressed();
    void SetShowStateBlindButtons(bool t);
    void AtualizaInfoJogador();
    void SetShowStateControlesAposta(bool b);
    void AtualizaBotoesAposta();
    void InitializeList();
    void ButtonRaisePressed();
    void ButtonCallPressed();
    void ButtonFoldPressed();
    void ButtonBetPressed();
    void ButtonCheckPressed();
};

#endif
